Trazendo os dados de MLP treinados pelo Diogo
resultados_mlp_prophet <- read_csv("resultados_mlp_prophet.csv")
resultados_mlp_graph <-
resultados_mlp_prophet %>%
filter(model == 'mlp') %>%
mutate(model = 'MLP') %>%
select(-`...1`) %>%
mutate(mes_ano = my(mes_ano)) %>%
mutate(macrorregiao_pad = case_when(codibge == 5206 ~ 'MACRORREGIAO SUDOESTE',
codibge == 5207 ~ 'MACRORREGIAO NORDESTE',
codibge == 5208 ~ 'MACRORREGIAO CENTRO-OESTE',
codibge == 5209 ~ 'MACRORREGIAO CENTRO-NORTE',
codibge == 5210 ~ 'MACRORREGIAO CENTRO SUDESTE')) %>%
select(macrorregiao_pad, mes_ano, model, total_nasc) %>%
filter(mes_ano < '2022-01-01')
Primeiro, vamos baixar os dados de nascidos e outras bases que possam contribuir para as análises.
Vamos, primeiramente, baixar os dados de Goiás e fazer alguns tratamentos (ex.: unir as colunas mês e ano)
nascidos <- sqlQuery(channel, 'SELECT * FROM "Analytics Layer"."Epidemiológico".Nascimentos."Nascidos Vivos por Macrorregião de Saúde"', as.is = TRUE)
nascidos$quantidade <- as.numeric(nascidos$quantidade)
nascidos_go <- nascidos %>%
filter(uf_sigla == "GO") %>%
mutate(mes_ano = paste(mes, ano, sep = ""),
mes_ano = my(mes_ano)) %>%
select(-mes,-ano) %>%
filter(mes_ano < "2022-01-01")
Visualizando o número de nascidos por macrorregião.
a <- nascidos_go %>%
ggplot(aes(x = mes_ano, y = quantidade, col = macrorregiao_pad)) + geom_line() +
theme_minimal()
plotly::ggplotly(a)
Primeiramente, vamos aplicar o modeltime apenas para a macrorregião Centro-Oeste.
Dividindo a base por treino e teste, usando os últimos 12 meses.
regiao_centro_oeste <- nascidos_go %>%
filter(macrorregiao_pad == "MACRORREGIAO CENTRO-OESTE") %>%
ungroup() %>%
select(-macrorregiao_pad)
splits_regiao_centro_oeste <- time_series_split(
regiao_centro_oeste,
assess = "12 months",
cumulative = TRUE
)
splits_regiao_centro_oeste %>%
tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(mes_ano, quantidade)
splits_regiao_centro_oeste
## <Analysis/Assess/Total>
## <252/12/264>
Treinando modelos
model_arima_regiao_centro_oeste <- arima_reg() %>%
set_engine("auto_arima") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_oeste))
model_prophet_regiao_centro_oeste <- prophet_reg(seasonality_yearly = TRUE) %>%
set_engine("prophet") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_oeste))
model_fit_ets_regiao_centro_oeste <- exp_smoothing() %>%
set_engine(engine = "ets") %>%
fit(quantidade ~ mes_ano, data = training(splits_regiao_centro_oeste))
model_tbl_regiao_centro_oeste <- modeltime_table(
model_arima_regiao_centro_oeste,
model_prophet_regiao_centro_oeste,
model_fit_ets_regiao_centro_oeste
)
Vamos avaliar a performance preditiva dos modelos.
calib_tbl_regiao_centro_oeste <- model_tbl_regiao_centro_oeste %>%
modeltime_calibrate(testing(splits_regiao_centro_oeste))
calib_tbl_regiao_centro_oeste %>% modeltime_accuracy()
## # A tibble: 3 × 9
## .model_id .model_desc .type mae mape mase smape rmse rsq
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 ARIMA(1,0,0)(1,1,0)[12] W… Test 152. 6.30 1.44 6.03 185. 0.432
## 2 2 PROPHET Test 143. 5.89 1.35 5.67 165. 0.638
## 3 3 ETS(M,N,A) Test 95.4 3.95 0.904 3.83 121. 0.639
De acordo com os resultados dos três algoritmos testados, o ETS possui melhor resultado, com MAPE, MAE e RMSE menores.
ets_treino_regiao_centro_oeste <- calib_tbl_regiao_centro_oeste[[5]][[3]] %>%
select(-.residuals) %>%
mutate(macrorregiao_pad = 'MACRORREGIAO CENTRO-OESTE',
.before = mes_ano) %>%
gather(key = 'model',
value = 'total_nasc',
3:4) %>%
mutate(model = if_else(model == '.prediction',
'ETS',
'REAL'))
graph <- resultados_mlp_graph %>%
filter(macrorregiao_pad == 'MACRORREGIAO CENTRO-OESTE')
ets_mlp_centro_oeste <- rbind(ets_treino_regiao_centro_oeste,graph)
ets_mlp_centro_oeste %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line(size = 0.8) +
theme_minimal() + xlab("Mês e ano") + ylab("Nascimentos")
calib_tbl_regiao_centro_oeste %>%
modeltime_forecast(
new_data = testing(splits_regiao_centro_oeste),
actual_data = regiao_centro_oeste
) %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
Apesar do ETS apresentar melhores resultados em termos de métricas, uma inspeção visual sugere a adoção do Prophet, pois o primeiro não está capturando a tendência de queda.
future_forecast_tbl_regiao_centro_oeste <- calib_tbl_regiao_centro_oeste %>%
modeltime_refit(regiao_centro_oeste) %>%
modeltime_forecast(h = "24 months",
actual_data = regiao_centro_oeste)
future_forecast_tbl_regiao_centro_oeste %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
future_forecast_tbl_regiao_centro_oeste %>%
filter(.model_desc == "PROPHET" | .model_desc == "ACTUAL") %>%
filter(.index > "2019-01-01") %>%
ggplot(aes(x = .index, y = .value, col = .key)) + geom_line() +
theme_minimal()
Dividindo a base por treino e teste, usando os últimos 12 meses.
regiao_nordeste <- nascidos_go %>%
filter(macrorregiao_pad == "MACRORREGIAO NORDESTE") %>%
ungroup() %>%
select(-macrorregiao_pad)
splits_regiao_nordeste <- time_series_split(
regiao_nordeste,
assess = "12 months",
cumulative = TRUE
)
splits_regiao_nordeste %>%
tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(mes_ano, quantidade)
splits_regiao_nordeste
## <Analysis/Assess/Total>
## <252/12/264>
Treinando modelos
model_arima_regiao_nordeste <- arima_reg() %>%
set_engine("auto_arima") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_nordeste))
model_prophet_regiao_nordeste <- prophet_reg(seasonality_yearly = TRUE) %>%
set_engine("prophet") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_nordeste))
model_fit_ets_regiao_nordeste <- exp_smoothing() %>%
set_engine(engine = "ets") %>%
fit(quantidade ~ mes_ano, data = training(splits_regiao_nordeste))
model_tbl_regiao_nordeste <- modeltime_table(
model_arima_regiao_nordeste,
model_prophet_regiao_nordeste,
model_fit_ets_regiao_nordeste
)
Vamos avaliar a performance preditiva dos modelos.
calib_tbl_regiao_nordeste <- model_tbl_regiao_nordeste %>%
modeltime_calibrate(testing(splits_regiao_nordeste))
calib_tbl_regiao_nordeste %>% modeltime_accuracy()
## # A tibble: 3 × 9
## .model_id .model_desc .type mae mape mase smape rmse rsq
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 ARIMA(3,0,0)(2,1,2)[12] Test 25.4 1.67 0.248 1.66 31.5 0.872
## 2 2 PROPHET Test 29.1 1.88 0.284 1.89 39.2 0.798
## 3 3 ETS(A,N,A) Test 27.5 1.79 0.269 1.79 36.8 0.822
De acordo com os resultados dos três algoritmos testados, o ARIMA possui melhor resultado, com MAPE, MAE e RMSE menores.
arima_treino_regiao_nordeste <- calib_tbl_regiao_nordeste[[5]][[1]] %>%
select(-.residuals) %>%
mutate(macrorregiao_pad = 'MACRORREGIAO NORDESTE',
.before = mes_ano) %>%
gather(key = 'model',
value = 'total_nasc',
3:4) %>%
mutate(model = if_else(model == '.prediction',
'ARIMA',
'REAL'))
arima_treino_regiao_nordeste %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line() + theme_minimal()
calib_tbl_regiao_nordeste %>%
modeltime_forecast(
new_data = testing(splits_regiao_nordeste),
actual_data = regiao_nordeste
) %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
A ARIMA apresentar melhores resultados em termos de métricas.
future_forecast_tbl_regiao_nordeste <- calib_tbl_regiao_nordeste %>%
modeltime_refit(regiao_nordeste) %>%
modeltime_forecast(h = "24 months",
actual_data = regiao_nordeste)
future_forecast_tbl_regiao_nordeste %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
future_forecast_tbl_regiao_nordeste %>%
filter(.model_desc == "ARIMA" | .model_desc == "ACTUAL") %>%
filter(.index > "2019-01-01") %>%
ggplot(aes(x = .index, y = .value, col = .key)) + geom_line() +
theme_minimal()
Dividindo a base por treino e teste, usando os últimos 12 meses.
regiao_centro_sudeste <- nascidos_go %>%
filter(macrorregiao_pad == "MACRORREGIAO CENTRO SUDESTE") %>%
ungroup() %>%
select(-macrorregiao_pad)
splits_regiao_centro_sudeste <- time_series_split(
regiao_centro_sudeste,
assess = "12 months",
cumulative = TRUE
)
splits_regiao_centro_sudeste %>%
tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(mes_ano, quantidade)
splits_regiao_centro_sudeste
## <Analysis/Assess/Total>
## <252/12/264>
Treinando modelos
model_arima_regiao_centro_sudeste <- arima_reg() %>%
set_engine("auto_arima") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_sudeste))
model_prophet_regiao_centro_sudeste <- prophet_reg(seasonality_yearly = TRUE) %>%
set_engine("prophet") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_sudeste))
model_fit_ets_regiao_centro_sudeste <- exp_smoothing() %>%
set_engine(engine = "ets") %>%
fit(quantidade ~ mes_ano, data = training(splits_regiao_centro_sudeste))
model_tbl_regiao_centro_sudeste <- modeltime_table(
model_arima_regiao_centro_sudeste,
model_prophet_regiao_centro_sudeste,
model_fit_ets_regiao_centro_sudeste
)
Vamos avaliar a performance preditiva dos modelos.
calib_tbl_regiao_centro_sudeste <- model_tbl_regiao_centro_sudeste %>%
modeltime_calibrate(testing(splits_regiao_centro_sudeste))
calib_tbl_regiao_centro_sudeste %>% modeltime_accuracy()
## # A tibble: 3 × 9
## .model_id .model_desc .type mae mape mase smape rmse rsq
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 ARIMA(1,0,0)(1,1,2)[12] Test 88.5 5.62 0.891 5.41 104. 0.694
## 2 2 PROPHET Test 71.4 4.54 0.719 4.40 82.3 0.791
## 3 3 ETS(A,N,A) Test 47.0 2.98 0.473 2.91 59.2 0.797
De acordo com os resultados dos três algoritmos testados, o ETS possui melhor resultado, com MAPE, MAE e RMSE menores.
ets_treino_regiao_centro_sudeste <- calib_tbl_regiao_centro_sudeste[[5]][[3]] %>%
select(-.residuals) %>%
mutate(macrorregiao_pad = 'MACRORREGIAO CENTRO SUDESTE',
.before = mes_ano) %>%
gather(key = 'model',
value = 'total_nasc',
3:4) %>%
mutate(model = if_else(model == '.prediction',
'ETS',
'REAL'))
ets_treino_regiao_centro_sudeste %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line() + theme_minimal()
calib_tbl_regiao_centro_sudeste %>%
modeltime_forecast(
new_data = testing(splits_regiao_centro_sudeste),
actual_data = regiao_centro_sudeste
) %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
A ETS apresentar melhores resultados em termos de métricas.
future_forecast_tbl_regiao_centro_sudeste <- calib_tbl_regiao_centro_sudeste %>%
modeltime_refit(regiao_centro_sudeste) %>%
modeltime_forecast(h = "24 months",
actual_data = regiao_centro_sudeste)
future_forecast_tbl_regiao_centro_sudeste%>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
future_forecast_tbl_regiao_centro_sudeste %>%
filter(.model_desc == "ETS" | .model_desc == "ACTUAL") %>%
filter(.index > "2019-01-01") %>%
ggplot(aes(x = .index, y = .value, col = .key)) + geom_line() +
theme_minimal()
Dividindo a base por treino e teste, usando os últimos 12 meses.
regiao_centro_norte <- nascidos_go %>%
filter(macrorregiao_pad == "MACRORREGIAO CENTRO-NORTE") %>%
ungroup() %>%
select(-macrorregiao_pad)
splits_regiao_centro_norte <- time_series_split(
regiao_centro_norte,
assess = "12 months",
cumulative = TRUE
)
splits_regiao_centro_norte %>%
tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(mes_ano, quantidade)
splits_regiao_centro_norte
## <Analysis/Assess/Total>
## <252/12/264>
Treinando modelos
model_arima_regiao_centro_norte <- arima_reg() %>%
set_engine("auto_arima") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_norte))
model_prophet_regiao_centro_norte <- prophet_reg(seasonality_yearly = TRUE) %>%
set_engine("prophet") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_centro_norte))
model_fit_ets_regiao_centro_norte <- exp_smoothing() %>%
set_engine(engine = "ets") %>%
fit(quantidade ~ mes_ano, data = training(splits_regiao_centro_norte))
model_tbl_regiao_centro_norte <- modeltime_table(
model_arima_regiao_centro_norte,
model_prophet_regiao_centro_norte,
model_fit_ets_regiao_centro_norte
)
Vamos avaliar a performance preditiva dos modelos.
calib_tbl_regiao_centro_norte <- model_tbl_regiao_centro_norte %>%
modeltime_calibrate(testing(splits_regiao_centro_norte))
calib_tbl_regiao_centro_norte %>% modeltime_accuracy()
## # A tibble: 3 × 9
## .model_id .model_desc .type mae mape mase smape rmse rsq
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 ARIMA(3,0,1)(2,1,0)[12] Test 41.7 3.40 0.662 3.41 50.4 0.506
## 2 2 PROPHET Test 40.8 3.38 0.647 3.31 48.7 0.614
## 3 3 ETS(A,N,A) Test 33.1 2.71 0.525 2.72 40.1 0.630
De acordo com os resultados dos três algoritmos testados, o ETS possui melhor resultado, com MAPE, MAE e RMSE menores.
ets_treino_regiao_centro_norte <- calib_tbl_regiao_centro_norte[[5]][[3]] %>%
select(-.residuals) %>%
mutate(macrorregiao_pad = 'MACRORREGIAO CENTRO-NORTE',
.before = mes_ano) %>%
gather(key = 'model',
value = 'total_nasc',
3:4) %>%
mutate(model = if_else(model == '.prediction',
'ETS',
'REAL'))
ets_treino_regiao_centro_norte %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line() + theme_minimal()
calib_tbl_regiao_centro_norte %>%
modeltime_forecast(
new_data = testing(splits_regiao_centro_norte),
actual_data = regiao_centro_norte
) %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
Apesar do ETS apresentar melhores resultados em termos de métricas, uma inspeção visual sugere a adoção do ARIMA, pois o primeiro não está capturando a tendência de queda.
future_forecast_tbl_regiao_centro_norte <- calib_tbl_regiao_centro_norte %>%
modeltime_refit(regiao_centro_norte) %>%
modeltime_forecast(h = "24 months",
actual_data = regiao_centro_norte)
future_forecast_tbl_regiao_centro_norte%>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
future_forecast_tbl_regiao_centro_norte %>%
filter(.model_desc == "ARIMA" | .model_desc == "ACTUAL") %>%
filter(.index > "2019-01-01") %>%
ggplot(aes(x = .index, y = .value, col = .key)) + geom_line() +
theme_minimal()
Dividindo a base por treino e teste, usando os últimos 12 meses.
regiao_sudoeste <- nascidos_go %>%
filter(macrorregiao_pad == "MACRORREGIAO SUDOESTE") %>%
ungroup() %>%
select(-macrorregiao_pad)
splits_regiao_sudoeste <- time_series_split(
regiao_sudoeste,
assess = "12 months",
cumulative = TRUE
)
splits_regiao_sudoeste %>%
tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(mes_ano, quantidade)
splits_regiao_sudoeste
## <Analysis/Assess/Total>
## <252/12/264>
Treinando modelos
model_arima_regiao_sudoeste <- arima_reg() %>%
set_engine("auto_arima") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_sudoeste))
model_prophet_regiao_sudoeste <- prophet_reg(seasonality_yearly = TRUE) %>%
set_engine("prophet") %>%
fit(quantidade ~ mes_ano, training(splits_regiao_sudoeste))
model_fit_ets_regiao_sudoeste <- exp_smoothing() %>%
set_engine(engine = "ets") %>%
fit(quantidade ~ mes_ano, data = training(splits_regiao_sudoeste))
model_tbl_regiao_sudoeste <- modeltime_table(
model_arima_regiao_sudoeste,
model_prophet_regiao_sudoeste,
model_fit_ets_regiao_sudoeste
)
Vamos avaliar a performance preditiva dos modelos.
calib_tbl_regiao_sudoeste <- model_tbl_regiao_sudoeste %>%
modeltime_calibrate(testing(splits_regiao_sudoeste))
calib_tbl_regiao_sudoeste %>% modeltime_accuracy()
## # A tibble: 3 × 9
## .model_id .model_desc .type mae mape mase smape rmse rsq
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 ARIMA(3,0,1)(2,1,0)[12] Test 45.3 5.99 2.11 5.74 55.6 0.306
## 2 2 PROPHET Test 45.6 6.04 2.13 5.79 54.9 0.316
## 3 3 ETS(M,N,A) Test 33.6 4.45 1.56 4.31 43.5 0.329
De acordo com os resultados dos três algoritmos testados, o ETS possui melhor resultado, com MAPE, MAE e RMSE menores.
ets_treino_regiao_sudoeste <- calib_tbl_regiao_sudoeste[[5]][[3]] %>%
select(-.residuals) %>%
mutate(macrorregiao_pad = 'MACRORREGIAO SUDOESTE',
.before = mes_ano) %>%
gather(key = 'model',
value = 'total_nasc',
3:4) %>%
mutate(model = if_else(model == '.prediction',
'ETS',
'REAL'))
ets_treino_regiao_sudoeste %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line() + theme_minimal()
calib_tbl_regiao_sudoeste %>%
modeltime_forecast(
new_data = testing(splits_regiao_sudoeste),
actual_data = regiao_sudoeste
) %>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
Apesar do ETS apresentar melhores resultados em termos de métricas.
future_forecast_tbl_regiao_sudoeste <- calib_tbl_regiao_sudoeste %>%
modeltime_refit(regiao_sudoeste) %>%
modeltime_forecast(h = "24 months",
actual_data = regiao_sudoeste)
future_forecast_tbl_regiao_sudoeste%>%
plot_modeltime_forecast(.conf_interval_show = FALSE)
future_forecast_tbl_regiao_sudoeste %>%
filter(.model_desc == "ETS" | .model_desc == "ACTUAL") %>%
filter(.index > "2019-01-01") %>%
ggplot(aes(x = .index, y = .value, col = .key)) + geom_line() +
theme_minimal()
teste <- rbind(ets_treino_regiao_sudoeste,
ets_treino_regiao_centro_norte,
ets_treino_regiao_centro_oeste,
ets_treino_regiao_centro_sudeste,
arima_treino_regiao_nordeste,
resultados_mlp_graph)
b <- teste %>%
ggplot(aes(x = mes_ano, y = total_nasc, col = model)) + geom_line(size = 0.8) +
facet_wrap(~macrorregiao_pad, nrow = 5, scales = 'free') + theme_minimal() +
xlab("Mês e ano") + ylab("Nascimentos")
plotly::ggplotly(b)
Vamos pegar os dados de previsão da MLP para todas as macrorregiões, com exceção da macrorregião Nordeste, on o Arima performou melhor
resultados_mlp_previsoes <-
resultados_mlp_prophet %>%
filter(model == 'mlp') %>%
mutate(model = 'MLP') %>%
select(-`...1`) %>%
mutate(mes_ano = my(mes_ano)) %>%
mutate(macrorregiao_pad = case_when(codibge == 5206 ~ 'MACRORREGIAO SUDOESTE',
codibge == 5207 ~ 'MACRORREGIAO NORDESTE',
codibge == 5208 ~ 'MACRORREGIAO CENTRO-OESTE',
codibge == 5209 ~ 'MACRORREGIAO CENTRO-NORTE',
codibge == 5210 ~ 'MACRORREGIAO CENTRO SUDESTE')) %>%
select(macrorregiao_pad, mes_ano, model, total_nasc) %>%
filter(mes_ano > '2021-12-01') %>%
filter(macrorregiao_pad != 'MACRORREGIAO NORDESTE')
resultado_arima_previsoes <-
future_forecast_tbl_regiao_nordeste %>%
filter(.model_id == 1 & .key == 'prediction') %>%
mutate(macrorregiao_pad = 'MACRORREGIAO NORDESTE',
model = 'ARIMA') %>%
rename(mes_ano = .index,
total_nasc = .value) %>%
select(macrorregiao_pad,
mes_ano, model,
total_nasc)
previsoes <- rbind(resultados_mlp_previsoes,
resultado_arima_previsoes)